gusucode.com > 各种VC自绘控件源码程序 > 各种VC自绘控件源码/code/SkinControls(自绘MFC基本控件 )/SkinControls/SkinControls/SkinComboBox.cpp
#include "stdafx.h" #include "SkinComboBox.h" IMPLEMENT_DYNAMIC(CSkinComboBox, CComboBox) BEGIN_MESSAGE_MAP(CSkinComboBox, CComboBox) ON_WM_PAINT() ON_WM_MOUSEMOVE() ON_WM_ERASEBKGND() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave) END_MESSAGE_MAP() ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// CSkinComboBox::CSkinComboBox() { m_bIsFocus = false; m_bLButtonDown = false; } CSkinComboBox::~CSkinComboBox() { } void CSkinComboBox::SetComboBtnImage(HRSRC hRes, DWORD imagetype, HMODULE hModule) { m_ImageButton.LoadResource(hRes, imagetype, hModule); m_ImageButton.SetTransIndex(0); m_ImageButton.SetTransColor(CxImage::RGBtoRGBQUAD(TRANS_COLOR)); } void CSkinComboBox::SetComboBtnImage(LPCTSTR pszFileName, DWORD imagetype) { //效验参数 ASSERT(pszFileName); if (pszFileName==NULL) return ; //加载位图 m_ImageButton.Load(pszFileName,imagetype); m_ImageButton.SetTransIndex(0); m_ImageButton.SetTransColor(CxImage::RGBtoRGBQUAD(TRANS_COLOR)); } void CSkinComboBox::SetComboFrameColor(COLORREF crFrameColor) { } void CSkinComboBox::OnPaint() { CPaintDC dc(this); CRect ClientRect; GetClientRect(&ClientRect); dc.FillSolidRect(&ClientRect, RGB(255,255,255)); dc.Draw3dRect(&ClientRect, DEF_FRAME_COLOR, DEF_FRAME_COLOR);//边框 int nBtnWidth = (int)m_ImageButton.GetWidth()/4; int nBtnHeight = (int)m_ImageButton.GetHeight(); int nXPos=(ClientRect.right-nBtnWidth-2); int nYPos=ClientRect.Height()/2-nBtnHeight/2; if (m_bIsFocus) m_ImageButton.Draw(dc.m_hDC, nXPos, nYPos,nBtnWidth,nBtnHeight, nBtnWidth,0, nBtnWidth,nBtnHeight); else if (m_bLButtonDown) m_ImageButton.Draw(dc.m_hDC, nXPos, nYPos,nBtnWidth,nBtnHeight, 0,0,nBtnWidth,nBtnHeight); else m_ImageButton.Draw(dc.m_hDC, nXPos, nYPos,nBtnWidth, nBtnHeight, nBtnWidth*2,0,nBtnWidth,nBtnHeight); //绘画字体 CString strText; GetWindowText(strText); CFont font; font.CreateFont(-12,0,0,0,400,0,0,0,134,3,2,1,2,TEXT("宋体")); dc.SelectObject(&font); dc.SetBkMode(TRANSPARENT); ClientRect.left+=3; dc.DrawText(strText,&ClientRect,DT_VCENTER | DT_SINGLELINE); } //鼠标移动消息 void CSkinComboBox::OnMouseMove(UINT nFlags, CPoint point) { if (m_bIsFocus==false) { //注册消息 m_bIsFocus=true; Invalidate(FALSE); TRACKMOUSEEVENT TrackMouseEvent; TrackMouseEvent.cbSize=sizeof(TrackMouseEvent); TrackMouseEvent.dwFlags=TME_LEAVE; TrackMouseEvent.hwndTrack=GetSafeHwnd(); TrackMouseEvent.dwHoverTime=HOVER_DEFAULT; _TrackMouseEvent(&TrackMouseEvent); } __super::OnMouseMove(nFlags, point); } //鼠标离开消息 LRESULT CSkinComboBox::OnMouseLeave(WPARAM wparam, LPARAM lparam) { m_bIsFocus=false; Invalidate(FALSE); return 0; } //绘画背景 BOOL CSkinComboBox::OnEraseBkgnd(CDC * pDC) { return TRUE; } void CSkinComboBox::OnLButtonDown(UINT nFlags, CPoint point) { m_bLButtonDown = true; m_bIsFocus = false; __super::OnLButtonDown(nFlags, point); } void CSkinComboBox::OnLButtonUp(UINT nFlags, CPoint point) { m_bLButtonDown = false; m_bIsFocus = true; __super::OnLButtonUp(nFlags, point); }